package com.wyedu.qqServer.service;

import com.wyedu.qqMessageTransfer.qqMessageTransfer;
import com.wyedu.qqOfflineMessage.MessageQueue;
import com.wyedu.qqcommon.Message;
import com.wyedu.qqcommon.MessageType;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.concurrent.BlockingQueue;

/**
 *
 *
 * 服务器连接客户端的线程类
 */
public class ServerConnectClientThread extends Thread{
    //两个属性,用户名,连接用户的socket
   private String Userid;
   private Socket socket = null;

   //此时构造这个类
   public ServerConnectClientThread(String userid, Socket socket) {
        Userid = userid;
        this.socket = socket;
    }

    public Socket getSocket() {
        return socket;
    }

    /**
     * 我给你发消息,你不在线,我给你发了离线消息
     * 等你上线之后,我的服务器自动将之前没发给你的重新发给你
     */
    @Override
    public void run() {
        try {


            while (true){
                qqMessageTransfer qmt = new qqMessageTransfer(socket);
               //读取传输来的信息
               ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
               System.out.println("用户"+Userid+"客户端和服务器保持通讯,读取数据....");

               //此时接受读取到的信息
               //此时接受客户端传来的message对象,后续的各种操作都是由message对象传递来的
               Message message = (Message) ois.readObject();

                //判断该用户是否存在
                if(QQServer.getUserId().contains(message.getGetter())){
                    //判断该用户是否在线
                    if(ManageServerConnectClientThread.getServerConnectClientThread(message.getGetter()) == null){
                        //此时不在线,添加入离线消息队列中
                        String str = message.getMesType().equals(MessageType.MESSAGE_COMM_MES)?"--留言":"";
                        message.setContent(message.getContent()+str);
                        MessageQueue.AddOfflineMessage(message.getGetter(),message);

                        System.out.println(message.getSender()+"对"+ message.getGetter()+"已进行留言");
                    }else {
                        //在这里就是在线
                        switch (message.getMesType()) {
                            case MessageType.MESSAGE_GET_ONLINE_FRIEND:

                                //请求返回所有在线用户
                                qmt.returnAllOnlineUsers(message);
                                break;
                            case MessageType.MESSAGE_CLIENT_EXIT:
                                //客户端请求关闭连接
                                qmt.exit(message);

                                /**
                                 * 客户端:我要断开链接了
                                 * 服务器:好的我知道了
                                 * 客户端:断开连接
                                 * 服务器:断开连接
                                 * */
                                ManageServerConnectClientThread.dleServerConnectClientThread(message.getSender());
                                return; //此时该线程就结束了
                            case MessageType.MESSAGE_COMM_MES:
                                //用户进行私聊
                                qmt.privateMessage(message);
                                break;
                            case MessageType.MESSAGE_COMM_MES_ALL:
                                //用户发起群聊
                                qmt.groupChat(message);
                                break;
                            case MessageType.MESSAGE_COMM_FILE:
                                //用户发送文件
                                qmt.sendFile(message);
                                break;
                            case MessageType.MESSAGE_COMM_FILE_ALL:
                                //群发送文件消息类型
                                qmt.GroupFile(message);
                                break;
                            default:
                                System.out.println("等待后续更新...");
                                break;
                        }
                    }
                }else {
                    //该用户不存在
                    //需要一个该用户不存在的方法
                   qmt.UserDoesNotExist(message);

                }

           }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
